package com.king.designpatterns.行为模式.状态模式;

/**
 * 状态模式（State Pattern）又称为状态对象模式，该模式允许一个对象在其内部状态改变时改变其行为。
 *
 * 定义：当一个对象内在状态改变时允许改变行为，这个对象看起来像改变了其类型。
 *
 * 角色：
 *      ■ 抽象状态（State）角色：
 *          该角色用以封装环境对象的一个特定状态所对应的行为。
 *      ■ 具体状态（Concrete State）角色：
 *          该角色实现环境的一个状态所对应的行为。
 *      ■ 环境（Context）角色：
 *          该角色定义客户端需要的接口，并负责具体状态的切换。它会保留一个具体状态类的实例，该实例给出环境对象的现有状态。
 *
 * 优缺点：
 *      优点：
 *          ■ 结构清晰。
 *          ■ 遵循设计原则。
 *          ■ 封装性非常好。
 *      缺点：
 *          ■ 子类太多，不易管理。
 *
 * 场景：
 *      ■ 对象的行为依赖于它所处的状态，即行为随状态改变而改变的场景。
 *      ■ 对象在某个方法里依赖于一重或多重条件分支语句，此时可以使用状态模式将分支语句中的每一个分支都包装到一个单独的类中，
 *          使得这些条件分支语句能够以类的方式独立存在和演化。如此，维护这些独立的类就不再影响到系统的其他部分。
 *
 * 效果：
 *      ■ 状态模式需要对每一个系统可能取得的状态创建一个状态类的子类。当系统的状态变化时，系统便改变所选的子类。
 *          所有与一个特定的状态有关的行为都被包装到一个特定的对象里面，使得行为的定义局域化。因为同样的原因，
 *          如果有新的状态以及它对应的行为需要定义时，可以很方便地通过设立新的子类的方式加到系统里，不需要改动其他的类。
 *      ■ 由于每一个状态都被包装到了类里面，就可以不必采用过程性的处理方式，使用长篇累牍的条件转移语句。
 *      ■ 使用状态模式使系统状态的变化变得很明显。由于不用一些属性来指明系统所处的状态，因此，就不用担心修改这些属性不当而造成的错误。
 *      ■ 可以在系统的不同部分使用相同的一些状态类的对象。这种共享对象的方法是与享元模式相符合的，
 *          事实上，此时这些状态对象基本上是只有行为而没有内部状态的享元。
 *      ■ 状态模式会造成大量的小状态类，但是可以使程序免于大量的条件转移语句，使程序实际上更易于维护。
 *      ■ 系统所选的状态子类均是从一个抽象状态类或接口继承而来，
 *          Java 语言的特性使得在Java语言中使用状态模式较为安全，多态性原则是状态模式的核心。
 *
 *
 * @author king
 * @date 2021-06-11 11:46
 */
public class StatePattern {
    public static void main(String[] args) {
        TV tv = new TV();
        // 换台
        tv.disCCTV1();
        tv.disCCTV2();
        tv.disCCTV3();
    }
}
